package com.promote.hotspot.server.model;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import lombok.extern.java.Log;

/**
 * @author enping.jep
 * @date 2023/11/16 21:48
 **/
@Log
public class AppInfo {
    /**
     * 应用名
     */
    private String appName;
    /**
     * 某app的全部channel  ChannelGroup来用于保存Channel组，ChannelGroup是一个线程安全的Channel集合。
     * <p>
     * Netty提供了ChannelGroup来用于保存Channel组，ChannelGroup是一个线程安全的Channel集合，它提供一些对Channel的批量操作。
     * 当一个TCP连接关闭后，对应的Channel会自动从ChannelGroup移除，所以不需要手动去移除关闭的Channel。
     * <p>
     * 当有新的客户端连接到服务器，将对应的Channel加入到一个ChannelGroup中，当发布者发布消息时，服务器可以将消息通过ChannelGroup写入到所有客户端。
     */
    private ChannelGroup channelGroup;

    public AppInfo(String appName) {
        this.appName = appName;
        //使用DefaultChannelGroup将每次连接的 Channel 存起来，每一个Channel 底层就是一个连接
        //EventExecutor 则用于执行与这些通道相关的异步任务，确保在 Netty 应用中实现高效的事件处理和通信。
        channelGroup = new DefaultChannelGroup(appName, GlobalEventExecutor.INSTANCE);
    }

    public void groupPush(Object object) {
        log.info("groupPush:" + object);
        channelGroup.writeAndFlush(object);
    }

    public void add(ChannelHandlerContext ctx) {
        channelGroup.add(ctx.channel());
    }

    public void remove(ChannelHandlerContext ctx) {
        channelGroup.remove(ctx.channel());
    }

    public String getAppName() {
        return appName;
    }

    public int size() {
        return channelGroup.size();
    }

}
